package org.xx.armory.rpc;

import java.io.InputStream;
import java.net.InetAddress;
import java.util.Collection;
import java.util.Date;

/**
 * RPC请求对象。
 *
 * @author Haart
 */
public interface RpcRequest
        extends AutoCloseable {
    /**
     * 获取发起请求的远程地址。
     *
     * @return 发起请求的远程地址，如果无法获取则返回{@code null}。
     */
    InetAddress getRemoteHost();

    /**
     * 获取RPC请求的方法。
     *
     * @return RPC请求的方法。
     */
    RpcVerb getVerb();

    /**
     * 获取RPC请求的内容类型。
     *
     * @return RPC请求的内容类型。
     */
    String getContentType();

    /**
     * 获取RPC请求可以接受的内容类型。
     *
     * @return RPC请求可以接受的内容类型。
     */
    String getAccept();

    /**
     * 获取最近请求的服务的有效日期。
     *
     * @return 最近请求服务的有效日期，未指定则返回{@code null}。
     */
    Date getIfModifiedSince();

    /**
     * 获取RPC请求的路径。
     *
     * @return RPC请求的路径，如果此路径以斜杠结尾, 那么去掉斜杠。
     */
    String getPath();

    /**
     * 获取RPC请求的查询字符串。
     *
     * @return RPC请求的查询字符串。
     */
    String getQueryString();

    /**
     * 获取RPC请求的Cookie集合。
     *
     * @return RPC请求的Cookies集合。
     */
    Collection<RpcCookie> getCookies();

    /**
     * 获取RPC请求的内容，此方法与{@code getInputStream()}方法冲突。
     *
     * @return RPC请求的内容。
     * @see #getInputStream()
     */
    String getBody();

    /**
     * 获取RPC请求的原始输入流，此方法与{@code getBody()}方法冲突。
     *
     * @return RPC请求的原始输入流。
     * @see #getBody()
     */
    InputStream getInputStream();
}
